/* 
总结:
    1、如果需要被 extends 或者 implements, 则尽量使用接口。
    2、如果需要使用联合类型或者元组类型，类型别名会更合适。
    3、如果是定义对象或函数，则都可以。
    4、如果实在不想选择的话，就能用interface实现，用interface，如果不能就用type。
*/

// 1.typeof 的类型别名可以用于其他的类型，比如 联合类型、元组类型、基本类型，interface 不行。
type t1 = { x: number };
type t2 = { y: number };

// 联合类型
type t3 = t1 | t2;
// 元组类型
type t4 = [t1, t2];
// 基本类型
type t5 = number;


// 2.type 的别名不可以多次定义会报错，而 interface 则可以多次定义，会将其视为合并到一起。
interface user {
    name: string;
}
interface user {
    age: number;
}

let u: user = {
    name: "",
    age: 0
};



// 3.type 能用 in 关键字，而interface不行。
type keys = "firstName" | "surname";
type DudeType = {
    [key in keys]: string;
};



// 4.默认导出的方式不同，inerface 支持同时声明，默认导出，而type必须先声明后导出
export default interface config {
    name: string
};
// type confg2 = { name: string }
// export default confg2;



// 5.扩展方式不同，interface 用 extends 来扩展，而type 用 & 操作符扩展
// extends 来扩展
interface t9 {
    name: string;
};
interface t10 extends t9 {
    age: number;
};

// & 操作符扩展
type t11 = { x: number };
type t12 = t11 & { y: number }